#include "../src/thread/thread.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ABDH#K###E##CFI###G#J##
// ABD#G##E##CF###
int main(int argc, const char *argv[])
{
    int ret = 0;
    BiTNode *tree = NULL;

    // 创建一个二叉树
    printf("请按照先序输入二叉树(空节点用#表示)：");
    tree = fBiTree.create();

    if (tree != NULL)
    {
        printf("\n二叉树创建成功！\n");
    }
    else
    {
        printf("\n二叉树创建出现异常！\n");
        ret = -1;
        goto ERROR_END;
    }

    printf("先序遍历输出：");
    fBiTree.prevOrder(tree);
    printf("\n");
    printf("后序遍历输出：");
    fBiTree.inOrder(tree);
    printf("\n");
    printf("后序遍历输出：");
    fBiTree.postOrder(tree);
    printf("\n");
    printf("层序遍历输出：");
    fBiTree.levelOrder(tree);
    printf("\n\n");

    int leaf = 0;
    fBiTree.leafNum(tree, &leaf);
    printf("节点的个数 = %d  叶子节点的个数 = %d, 树的深度/高度 = %d\n", fBiTree.nodeNum(tree), leaf, fBiTree.depth(tree));

    BiTNode *tmp = NULL;
    fthread.postThread(tree, &tmp);

    printf("\n后序线索化正序遍历输出：");
    fthread.Older(tree);

    printf("\n后序线索化倒序遍历输出：");
    fthread.byPrevOlder(tree);

    printf("\n");

    tmp = NULL;

ERROR_END:
    // 释放二叉树
    // fBiTree.release(tree);

    printf("system exited with return code %d\n", ret);

    return ret;
}
/*
ABDH#K###E##CFI###G#J##
*/

#if 0
先序遍历输出：A B D H K E C F I G J
后序遍历输出：K H D E B I F J G C A

节点的个数 = 11  叶子节点的个数 = 4, 树的深度/高度 = 5

先序遍历输出：A B D H K E C F I G J
copy树后序线索化遍历输出：A C G J F I B E D H K


先序遍历输出：A B D G E C F
后序遍历输出：G D E B F C A
copy树后序线索化遍历输出：

A C F B E D G

A C F B E D G

先序的前驱： 
1、该结点是根，不存在前驱 
2、该结点是左孩子，前驱是父节点。 
3、该结点是右孩子且没有左孩子，前驱为父结点。 
4、该结点为右孩子，且存在左孩子，前驱为左孩子子树中的先序最后遍历结点。 

后序遍历的后继： 
1、该结点是根，不存在后继 
2、该结点是右孩子，后继是父结点 
3、该结点是左孩子且没有右孩子，后继是父结点 
4、该结点是左孩子且存在右孩子，后继为右孩子子树中后序遍历第一个结点 

综上，需要用到父结点来找前后驱


先序和后序二叉树线索化无法找到前驱和后继，需要用三叉树才可以。

#endif
